home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Input 64
/
Input_64_87-09_1987_Verlag_Heinz_Weise_de.d64
/
ici 2
< prev
next >
Wrap
Text File
|
2023-02-26
|
5KB
|
133 lines
org $9000
; erweiterung fuer ici - move kommando
; (w) frank boerncke (c) input64
; arbeitsvariablen fuer move-routine
:w1=$57
:w2=$58
:w3=$59
:w4=$5a
; ruecksprungadresse
:backici = $c17f
; systempuffer
:inkbuf = 679 ;input-string
:tmpbuf = inkbuf+39 ;befehlsstrings
; konstanten von ici
:dnum = $cda9 ; aktuelle geraeteadresse
:echo = $cdaa ; echomodus an/aus
:fstat = $cdab ; file gerade offen?
:copyn = $cdac ; anzahl laufwerke bei pip
:sek = $cdad ; lademodus
:mcom = $cdae ; noch ein kommando in der zeile?
:batchm = $cdaf ; batchmodus an/aus
:cbatl = $cdb0 ; zeiger auf aktuelles ...
:cbath = $cdb1 ; ... kommando im batchpuffer
:bathl = $cdb2 ; batchpuffer ende-low
:bathh = $cdb3 ; ende-high
:batll = $cdb4 ; anfang-low
:batlh = $cdb5 ; anfang-high
:icihl = $cdb6 ; icipuffer ende-low
:icihh = $cdb7 ; ende-high
:icill = $cdb8 ; anfang-low
:icilh = $cdb9 ; anfang-high
:adrl = $cdba ; 16-bit-wert low-byte
:adrh = $cdbb ; high-byte
; routinen der ici-sprungleiste
:inkey = $cdc1 ; string holen
:strout = $cdc4 ; string ausgeben
:print = $cdc7 ; zeichen ausgeben
:decode = $cdca ; vektor in interpreterschleife
:fopen = $cdcd ; datei auf diskette oeffnen
:fclose = $cdd0 ; datei schliessen
:status = $cdd3 ; fehlerkanal ausgeben
:device = $cdd6 ; laufwerk angeschlossen?
:echon = $cdd9 ; echomodus anschalten
:echof = $cddc ; echomodus abschalten
:dos = $cddf ; befehlsstrings senden
:basc = $cde2 ; bildschirmcode in ascii wandeln
:hexout = $cde5 ; hexadezimalzahl ausgeben
:ghexn = $cde8 ; 4-bit hexwert holen
:ghexw = $cdeb ; 16-bit hexwert holen
:ghexb = $cdee ; 8-bit hexwert holen
:filt = $cdf1 ; steuerzeichen ausfiltern
:error = $cdf4 ; fehlermeldung ausgeben
:nxtcom = $cdf7 ; leerzeichen ueberlesen
; routine durch vektor newcom in ici einbinden
; init darf nur einmal aufgerufen werden
:init lda decode+1 ; das alte ziel von
ldy decode+2 ; decode dient jetzt
sta end+1 ; als rucksprungadresse
sty end+2 ; fuer die eigene routine
lda #<newcom ; der vektor decode
sta decode+1 ; zeigt ab jetzt
lda #>newcom ; auf die eigene
sta decode+2 ; decodierroutinen
rts ; zurueck zu basic
; test, ob die naechste zeichenfolge = move ist
:newcom ldy #$ff ; zaehler initialisieren
:search iny ; zaehler erhoehen
lda (w1),y ; naechstes zeichen holen
beq execute ; bei stringende wird in die eigene
cmp #32 ; routine verzweigt. dieser fall wird
beq execute ; durch space oder 0 angezeigt
cmp comtab,y ; mit zeichen aus tabelle vergleichen
beq search ; wenn gleich dann weitervergleichen
:end jmp $ffff ; kommando wurde nicht erkannt.
; zurueck zur normalen decodierung
; $ffff wird durch init gesetzt
:comtab b"move",0 ; neuer kommandoname
; zeiger und adressen setzen
:execute tya ; vektor w1/w2 so hochsetzen,
clc ; dass er auf das zeichen
adc w1 ; hinter dem kommando 'move'
sta w1 ; in dem eingabepuffer zeigt.
lda #0 ; dazu wird die kommandolaenge
adc w2 ; einfach zum vektor addiert.
sta w2 ; ( 16-bit addition )
lda w1 ; der zeiger (w1/w2) wird auf
pha ; dem stack gesichert, weil er
lda w2 ; fuer die weitere abarbeitung
pha ; der aktuellen zeile wichtig ist
lda #13 ; erzeugt einen zeilenvorschub auf
jsr print ; dem bildschirm.
lda #0 ; mcom = 0 zeigt an, dass nur noch
sta mcom ; parameter folgen aber kein kommando
; ab hier die eigentliche routine
:move jsr nxtcom ; leerzeichen ueberlesen
jsr ghexw ; 2-byte hexzahl nach w3/w4 schreiben
ldy #0 ; den wert auslesen, auf den der
lda (w3),y ; vektor (w3/w4) zeigt und ihn dann
pha ; auf dem stack zwischenlagern.
jsr nxtcom ; leerzeichen ueberlesen
jsr ghexw ; 2-byte hexzahl nach w3/w4 schreiben
ldy #0 ; den wert auslesen, auf den der
lda (w3),y ; vektor (w3/w4) zeigt und ihn dann
tax ; adresse low-byte nach x-register
iny ; adresse+1
lda (w3),y ; adresse high-byte auslesen
stx w3 ; adresse nach w3/w4
sta w4 ;
pla ; zwischengelagerten wert holen...
dey ; ... und in die angegebene
sta (w3),y ; adresse hineinschreiben.
jmp backici ; ruecksprung zu ici